/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function (height) {
  const n = height.length //柱子个数：n-1是最后一个索引
  const l = new Array(n).fill(0) //左侧柱子信息
  const r = new Array(n).fill(0) //右侧柱子信息
  let ans = 0

  for (let i = 1; i < n; i++) { //for循环遍历
    // 取左侧最高的
    l[i] = Math.max(l[i - 1], height[i - 1]) //动态规划：在左侧或当前这根中取最大值
  }
  for (let i = n - 2; i >= 0; i--) { //n-1是最后一个索引，最后一个是0，所以从n-2开始
    // 取右侧最高的
    r[i] = Math.max(r[i + 1], height[i + 1]) //动态规划：在右侧或当前这根中取最大值
    // 求当前点能接多少雨水
    const short = Math.min(l[i], r[i]) //取左右最小值
    if (short > height[i]) { //如果两侧柱子比当前柱子高，才能接雨水
      ans += short - height[i] //左右最短 - 当前柱子高度
    }
  }
  return ans
};